/*
 * Created : 2004/May/26
 *
 * Copyright (C) Azureus Software, Inc, All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details ( see the LICENSE file ).
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package org.gudy.azureus2.plugins.disk;

import java.io.File;

import org.gudy.azureus2.plugins.download.Download;
import org.gudy.azureus2.plugins.download.DownloadException;

/**
 * @author TuxPaper
 * 
 * @since 2.1.0.0
 */

public interface DiskManagerFileInfo {
    public static final int READ = 1;
    public static final int WRITE = 2;

    public static final int PRIORITY_LOW = -1;
    public static final int PRIORITY_NORMAL = 0;
    public static final int PRIORITY_HIGH = 1;

    // set methods

    public void setPriority(boolean b);

    /**
     * Sets the file's download priority base on a number
     * 
     * @param priority
     *            Any number or {@link #PRIORITY_LOW}, {@link #PRIORITY_NORMAL}, {@link #PRIORITY_HIGH}
     * 
     * @since 4407
     */
    public void setNumericPriority(int priority);

    public void setSkipped(boolean b);

    /**
     * Mark the file as deleted or not (deleted means the file will be truncated to take up minimum space). This is generally 0 <= X < 2*piece_length
     * as pieces can span file boundaries.
     * 
     * @since 2403
     * @param b
     */

    public void setDeleted(boolean b);

    // links the file to the named destination

    public void setLink(File link_destination);

    // gets the current link, null if none

    public File getLink();

    // get methods

    public int getAccessMode();

    public long getDownloaded();

    /**
     * Size when file is complete
     */
    public long getLength();

    public File getFile();

    /**
     * returns liked file if it exists, direct otherwise
     * 
     * @param follow_link
     * @return
     * @since 4.3.1.5
     */

    public File getFile(boolean follow_link);

    public int getIndex();

    public int getFirstPieceNumber();

    public long getPieceSize();

    public int getNumPieces();

    public boolean isPriority();

    /**
     * @since 4407
     * @return
     * @deprecated
     */

    public int getNumericPriorty();

    /**
     * 
     * @return
     * 
     * @since 4.8.1.3
     */
    public int getNumericPriority();

    public boolean isSkipped();

    public boolean isDeleted();

    public byte[] getDownloadHash()

    throws DownloadException;

    public Download getDownload()

    throws DownloadException;

    public DiskManagerChannel createChannel()

    throws DownloadException;

    /**
     * Creates a random read request - these will be executed against the download sequentially
     * 
     * @param file_offset
     * @param length
     * @param reverse_order
     *            - deliver blocks to the listener in reverse order
     * @param listener
     * @return
     * @throws DownloadException
     */

    public DiskManagerRandomReadRequest createRandomReadRequest(long file_offset, long length, boolean reverse_order, DiskManagerListener listener)

    throws DownloadException;
}
